package com.cc.data_explore.logic.rule;

import org.dromara.hutool.core.text.StrUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 规则处理类，用于管理一系列字符串处理规则，并按顺序对输入字符串进行处理。
 *
 * @author cc
 */
public class RuleProcess {
    /**
     * 存储一系列字符串处理规则的列表，每个规则是一个 Function 类型，接收一个字符串并返回处理后的字符串。
     */
    private final List<Function<String, String>> rules = new ArrayList<>();
    /**
     * 异常处理程序，用于处理规则应用过程中抛出的异常。
     */
    private RuleExceptionHandler exceptionHandler;

    /**
     * 添加一个字符串处理规则到规则列表中。
     * 支持链式调用，方便连续添加多个规则。
     *
     * @param rule 要添加的字符串处理规则，该规则接收一个字符串并返回处理后的字符串。
     * @return 当前 RuleProcess 对象，以便进行链式调用。
     */
    public RuleProcess add(Function<String, String> rule) {
        // 将传入的规则添加到规则列表中
        rules.add(rule);
        return this;
    }

    /**
     * 对输入的字符串数据按顺序应用规则列表中的所有规则进行处理。
     * 如果输入字符串为空，则直接返回原输入；
     * 如果在应用规则过程中抛出异常，会调用异常处理程序处理异常，并停止后续规则的应用。
     *
     * @param input 要处理的输入字符串。
     * @return 处理后的字符串结果。
     */
    public String process(String input) {
        // 检查输入字符串是否为空，如果为空则直接返回原输入
        if (StrUtil.isEmpty(input)) {
            return input;
        }
        String result = input;
        for (Function<String, String> rule : rules) {
            try {
                result = rule.apply(result);
            } catch (Exception e) {
                exceptionHandler.handler(new RuleException(input, e));
                break;
            }
        }
        return result;
    }

    public RuleProcess onException(RuleExceptionHandler handler) {
        this.exceptionHandler = handler;
        return this;
    }

    public static RuleProcess start() {
        return new RuleProcess();
    }

}